﻿/// <reference path="jquery-1.7.2.js" />
(function ($) {
    $.fn.SparrowTabControl = function (options) {
        var defaults =
        {

            height: '100%',
            autoHeight: true,
            onBeforeSelectTabItem: null,
            onAfterSelectTabItem: null,
            onAfterAddTabItem: null,
            onBeforeRemoveTabItem: null,
            onAfterRemoveTabItem: null,
            heightDiff: 0,
            autoReLoad: false,
            maxTabCount: 10,
            space: 4
        };
        $.extend(defaults, options);


        var g = {
            getNewTabid: function () {
                var now = new Date();
                return now.getTime();
            },
            onResize: function () {
                if (!defaults.height || typeof (defaults.height) != 'string' || defaults.height.indexOf('%') == -1) return false;
                //set tab height
                if (g.tab.parent()[0].tagName.toLowerCase() == "body") {
                    var windowHeight = $(window).height();
                    windowHeight -= parseInt(g.tab.parent().css('paddingTop'));
                    windowHeight -= parseInt(g.tab.parent().css('paddingBottom'));
                    g.height = defaults.heightDiff + windowHeight * parseFloat(g.height) * 0.01;
                }
                else {
                    g.height = defaults.heightDiff + (g.tab.parent().height() * parseFloat(defaults.height) * 0.01);
                }
                g.tab.height(g.height);
                g.setContentHeight();
            },
            //判断tab是否存在
            isTabItemExist: function (tabid) {
                return $("li[tabid=" + tabid + "]", g.tab.links.ul).length > 0;
            },
            reLoad: function (tabId, param) {

                if (!tabId || tabId === null) {
                    tabId = g.selectedTabId;
                }
                var content = $("> .l-tab-content-item[tabid=" + tabId + "]", g.tab.content);
                var iframe = content.find("> iframe");
                //将URL上加上时间戳
                var newUrl = iframe.attr("url");
                if (!newUrl) {
                    return;
                }
                newUrl += iframe.attr("url").indexOf("?") > 0 ? "&" : "?";

               
                g.Loading.show();

                if (param !== null && param !== undefined) {
                    newUrl += param;
                }
                else {
                    newUrl += "random=" + (new Date()).getTime();
                }
                iframe.attr("src", newUrl);
                iframe.bind('load.tab', function () {
                    g.Loading.hide();
                });
            },
            //选中tab项
            selectTabItem: function (tabid) {
                if (defaults.onBeforeSelectTabItem && defaults.onBeforeSelectTabItem(tabid) == false) return false;

                g.selectedTabId = tabid;
                var content = $("> .l-tab-content-item[tabid=" + tabid + "]", g.tab.content);
                content.show().siblings().hide();
                $("li[tabid=" + tabid + "]", g.tab.links.ul).addClass("l-selected").siblings().removeClass("l-selected");

                defaults.onAfterSelectTabItem && defaults.onAfterSelectTabItem(tabid);
            },
            //移动到最后一个tab
            moveToLastTabItem: function () {
                var sumwidth = 0;
                $("li", g.tab.links.ul).each(function () {
                    sumwidth += $(this).width() + 2;
                });
                var mainwidth = g.tab.width();
                if (sumwidth > mainwidth) {
                    var btnWitdth = $(".l-tab-links-right", g.tab.links).width();
                    g.tab.links.ul.animate({ left: -1 * (sumwidth - mainwidth + btnWitdth + 2) });
                }
            },
            //增加一个tab
            addTabItem: function (options) {
                var tabid = options.tabid;
                if (tabid == undefined) tabid = g.getNewTabid();
                if (defaults.onBeforeAddTabItem && defaults.onBeforeAddTabItem(tabid) == false) return false;
                if ($("li[tabid]", g.tab.links).length > defaults.maxTabCount) {
                    var lastTabId = $("li[tabid]:last", g.tab.links).attr("tabid");
                    g.removeTabItem(lastTabId);
                }
                var url = options.url;
                var content = options.content;
                var text = options.text;
                var showClose = options.showClose;
                var height = options.height;
                //如果已经存在
                if (g.isTabItemExist(tabid)) {
                    g.selectTabItem(tabid);
                    g.reLoad();
                    return;
                }
                var tabitem = $("<li><a></a><div class='l-tab-links-item-left'></div><div class='l-tab-links-item-right'></div><div class='l-tab-links-item-close'></div></li>");
                var contentitem = $("<div class='l-tab-content-item'><iframe frameborder='0' url=''></iframe></div>");
                if (defaults.autoHeight) {
                    var newheight = g.tab.height() - g.tab.links.height();
                    contentitem.height(newheight);
                }
                tabitem.attr("tabid", tabid);
                contentitem.attr("tabid", tabid);
                if (showClose == undefined) showClose = true;
                if (showClose == false) $(".l-tab-links-item-close", tabitem).remove();
                if (text == undefined) text = tabid;
                if (height) contentitem.height(height);
                $("a", tabitem).text(text);

                g.tab.links.ul.append(tabitem);
                g.tab.content.append(contentitem);
                g.selectTabItem(tabid);
                //增加事件
                g.addTabItemEvent(tabitem);
                var iframe = $("iframe", contentitem);
                g.Loading.show();
                var newUrl = url + (url.indexOf("?") > 0 ? "&" : "?");
                newUrl += "random=" + (new Date()).getTime();
                try {
                    iframe.attr("name", tabid).attr("id", tabid).attr("url", url).attr("src", newUrl);

                    iframe.bind('load.tab', function () {
                        g.Loading.hide();
                    });
                    defaults.onAfterAddTabItem && defaults.onAfterAddTabItem(tabid);
                }
                catch (err) {
                    g.Loading.hide();
                }
            },
            addTabItemEvent: function (tabitem) {
                tabitem.click(function () {
                    var tabid = $(this).attr("tabid");
                    g.selectTabItem(tabid);
                    if (tabid === "home") {
                        g.reLoad();
                    }
                });
                tabitem.hover(function () {
                    tabitem.find(">a").addClass("l-tab-links-hover");
                }, function () {
                    tabitem.find(">a").removeClass("l-tab-links-hover");
                });
                //右键事件支持
                //g.tab.menu && po.addTabItemContextMenuEven(tabitem);
                $(".l-tab-links-item-close", tabitem).hover(function () {
                    $(this).addClass("l-tab-links-item-close-over");
                }, function () {
                    $(this).removeClass("l-tab-links-item-close-over");
                }).click(function () {
                    var tabid = $(this).parent().attr("tabid");
                    g.removeTabItem(tabid);
                });

            },
            //移除tab项
            removeTabItem: function (tabid) {
                try {
                    if (defaults.onBeforeRemoveTabItem && defaults.onBeforeRemoveTabItem(tabid) == false) return false;
                    var currentIsSelected = $("li[tabid=" + tabid + "]", g.tab.links.ul).hasClass("l-selected");
                    if (currentIsSelected) {
                        $(".l-tab-content-item[tabid=" + tabid + "]", g.tab.content).prev().show();
                        $("li[tabid=" + tabid + "]", g.tab.links.ul).prev().addClass("l-selected").siblings().removeClass("l-selected");
                    }
                    $(".l-tab-content-item[tabid=" + tabid + "]", g.tab.content).remove();
                    $("li[tabid=" + tabid + "]", g.tab.links.ul).remove();
                    defaults.onAfterRemoveTabItem && defaults.onAfterRemoveTabItem(tabid);
                }
                catch (Error) {
                    g.Loading.hide();
                }
                finally {
                    g.Loading.hide();
                }
            },
            setHeight: function (height) {
                g.tab.height(height);
                g.setContentHeight();
            },
            setContentHeight: function () {
                var newHeight = g.tab.height() - g.tab.links.height();
                g.tab.content.height(newHeight);
                $("> .l-tab-content-item", g.tab.content).height(newHeight);
                $("#pageloading", g.tab.content).height(newHeight);
            }
        };

        g.tab = $(this);
        g.tab.content = $('<div class="l-tab-content"><div id="pageloading"></div></div>');

        $("> div", g.tab).appendTo(g.tab.content);
        g.tab.content.appendTo(g.tab);
        g.tab.links = $('<div class="l-tab-links"><ul id="tabs"></ul><div style="float:right;width:60px;padding-top:4px;cursor:pointer;"><a style="color:#000;TEXT-DECORATION:none;" href="/Admin/LoginOut.aspx">安全退出</a></div><div id="refresh" style="float:right;width:40px;padding-top:4px;cursor:pointer;"><a>刷新</a> </div> </div>');
        g.tab.links.prependTo(g.tab);
        g.tab.links.ul = $("ul", g.tab.links);
        g.Loading = $("#pageloading", g.tab.content);

        $("#refresh", g.tab.links).hover(function () {
            $(this).find(">a").addClass("l-tab-links-hover");
        }, function () {
            $(this).find(">a").removeClass("l-tab-links-hover");
        });
        $("#refresh", g.tab.links).click(function () {
            g.reLoad();
        });

        var hasSelected = $("> div[lselected=true]", g.tab.content).length > 0;
        g.selectedTabId = $("> div[lselected=true]", g.tab.content).attr("tabid");


        $("> div", g.tab.content).each(function (i, box) {
            var li = $('<li class=""><a></a><div class="l-tab-links-item-left"></div><div class="l-tab-links-item-right"></div></li>');
            if ($(box).attr("title")) {
                $("> a", li).html($(box).attr("title"));
            }
            else {
                return;
            }
            var tabid = $(box).attr("tabid");
            if (tabid == undefined) {
                tabid = g.getNewTabid();
            }
            $(box).attr("tabid", tabid);
            if ($(box).attr("lselected")) {
                g.selectedTabId = tabid;
            }
            li.attr("tabid", tabid);
            if (!hasSelected && !g.selectedTabId) g.selectedTabId = tabid;
            var showClose = $(box).attr("showClose");
            if (showClose) {
                li.append("<div class='l-tab-links-item-close'></div>");
            }
            $("> ul", g.tab.links).append(li);
            if (!$(box).hasClass("l-tab-content-item")) $(box).addClass("l-tab-content-item");
            var contentItem = $(this);
            if (!contentItem.hasClass("l-tab-content-item")) {
                contentItem.addClass("l-tab-content-item");
            }
            if (tabid == g.selectedTabId) {
                var iframe = $("iframe", contentItem);
                if (iframe) {
                    if (!iframe.attr("src")) {
                        iframe.attr("src", iframe.attr("url"));
                    }
                    iframe.attr("name", tabid).attr("id", tabid);
                    iframe.bind('load.tab', function () {
                        g.Loading.hide();
                    });
                }
            }
        });
        g.selectTabItem(g.selectedTabId);


        //set content height
        if (defaults.height) {
            if (typeof (defaults.height) == 'string' && defaults.height.indexOf('%') > 0) {
                g.onResize();
                if (defaults.autoHeight) {
                    $(window).resize(function () {
                        g.onResize();
                    });
                }
            } else {
                g.setHeight(defaults.height);
            }
        }
        //add even
        $("li", g.tab.links).each(function () {
            g.addTabItemEvent($(this));
        });
        return g;
    }
})(jQuery)